/**
 * Clase para crear objetos de tipo pila con profundidad definida.
 */
package Structures;

import java.util.NoSuchElementException;

/**
 * Instancia una estructura de datos pila.
 * @author Jeremy
 * @author Gabriel
 * @author Rodrigo
 * @author Alexandre
 */
public class UnBoundedStack {
    private SLLNode _top; //Atributo tipo SLLNode para referencia al tope de la pila
    
    /**
     * Construye una pila dinamica con su referencia al tope en nulo.
     */
    public UnBoundedStack() {
        _top = null;        
    }
    
    /**
     * Verifica si la pila esta completamente vacia
     * @return true si la pila no contiene elementos, false de lo contrario
     */
    public boolean isEmpty() {
        return (_top == null);
    }

    /**
     * Obtiene el elemento que esta en el tope de la pila sin eliminarlo de la misma.
     * @return Nodo de grafo que esta en el tope
     */
    public Node getTop() {
        if (_top == null) {
            throw new NoSuchElementException( );
        }
        return (Node) _top.getElement();
    }

    /**
     * Elimina todos los elementos de la pila, dejandola completamente vacia.
     */
    public void clear() {
        _top = null;
    }

    /**
     * Añade un elemento al tope de la pila
     * @param pElement Elemento para añadir
     */
    public void top(Node pElement) {
        _top = new SLLNode(pElement, _top);
    }

    /**
     * Extrae el elemento del tope y lo remueve.
     * @return Elemento del tope
     */
    public Node pop() {
        if (_top == null) {
            throw new NoSuchElementException();
        }
        SLLNode tmp = _top;
        _top = _top.getSucc();
        return (Node) tmp.getElement();
    }
}
